<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="../js/02-回调函数.js"></script>
<script>
    t1();//
    function t1() {
        //全局函数，支持声明提升
        console.log("全局函数");
    }
    window.t1();

    // t2();不支持声明提升
    //函数表达式
    let t2 = function () {
        //没有声明提升
        console.log("函数表达式");
    }
    // t2();
    // window.t2();let定义，不支持，var定义时，支持

    function t3() {
        //也是嵌套函数的一种体现
        return function () {
            //匿名函数只有在定义时，立即调用
            //当函数做返回值时调用
            console.log("匿名函数");
        }
    }

    t3()();//调用匿名函数

    (function () {
        console.log("立即执行函数");
    })();

    //嵌套函数：就是函数定义函数
    function t4() {
        let name = "haha";
        function t41() {
            //只要内函数使用了外函数中的变量名方法，那么就称为闭包
            //闭包的作用，可以将函数中的变量暴露出去
            //性能降低
            console.log(name);
            console.log("作用域只在t4()函数的作用域");
            //嵌套函数可以使用外函数所有变量和方法
        }
        t41();

        return t41;
    }

    // t41();//无效的
    let t411 = t4();
    t411();

    //回调函数，将一个函数作为参数传入到另一个函数，那么做参数的函数就是回调函数
    //可以扩展函数的功能
    function t5(callback) {
        //写回调函数执行之前的代码
        callback();//执行了回调函数
        t51();
        //写回调函数执行之后的代码
    }

    function t51() {
        console.log("这是回调函数");
    }

    tt(t51);

    //定时器
    setTimeout(function (a, b) {
        console.log("你好", a, b);
    }, 2000, 10, 20);

    //全局函数
    t6 =  () => {
        console.log("=>全局函数");
    }

    window.t6();

    () => {
        console.log("=>匿名函数");
    };

    (() => {
        console.log("=>立即执行函数");
    })();

    //只有一个参数，如果函数体只有一行代码，默认会将这行代码做为返回值返回
    t7 = x => x * x;
    console.log(t7(10));

    //了解即可
    let t8 = new Function("a", "console.log(a);");
    t8(10);

    //形参列表
    function t9(a, b = 20, c = 30) {
        if (!a) {
            a = 10;
        }
        console.log(a, b, c);
        for (let index in arguments) {
            console.log(arguments[index]);
        }
    }
    t9();//一个实参都不传
    t9(1);
    t9(1, 2, 3);
    t9(1, 2, 3, 40, 50);

    function t10(a, b) {
        return a + b;
    }

    let t11 = function (a, b) {return a + b;}

    let t12 = (a, b) => a + b;
</script>
</body>
</html>